Pro práci s náhodnými čísly potřebujeme použít modul random. Importujeme jej stejně jako modul tkinter, tedy na začátku programu. Nyní můžeme použít příkazy random.randint(), random.randrange() a další.
import tkinter
import random
canvas = tkinter.Canvas()
canvas.pack()
canvas.create_text(100, 100, text=random.randint(10, 20))
canvas.create_text(150, 100, text=random.randint(5, 8))
Tento program vypíše dvě náhodná celá čísla. Jedno bude na souřadnici [100, 100] a bude z intervalu <10, 20>, druhé bude na souřadnici [150, 100] a bude z intervalu <5, 8>.
Jaká čísla bude program zapisovat na souřadnici [150, 100]?
Zjistěte, která čísla program vypíše na souřadnici [150, 100] nahrazením random.randint(5,8) za random.randrange(5).
Jaká čísla se vytisknou, pokud použijeme příkaz v příkazu:
a. random.randrange(2),
b. random.randrange(1).
Jaký je rozdíl mezi random.randrange(3,5) a random.randint(3,5)?
Můžeme také psát příkazy přímo v příkazovém režimu (v okně prostředí Pythonu). Stačí napsat příkaz do příkazového řádku a po stisknutí klávesy Enter se zadaný příkaz okamžitě provede. Právě v příkazovém režimu můžeme otestovat, která náhodná čísla bude počítač “losovat”. Pokud jsme nespustili žádný program, ve kterém importujeme modul na náhodná čísla, můžeme modul importovat i přímo z příkazové řádky. Tady je ukázka příkazů, které jsme zadali na příkazovém řádku:
>>> import random
>>> random.randint(10, 15)
11
>>>
Vyzkoušejte si, co tento program nakreslí:
import tkinter
import random
canvas = tkinter.Canvas()
canvas.pack()
canvas.create_line(0, 0, random.randrange(200), 100)
Abychom lépe viděli, kde jsou tyto čáry, které mají náhodné číslo v jedné ze souřadnic, nakresleny, můžeme také zadávat příkazy přímo v shellu (příkazový režim) i do běžícího programu (již existuje okno s grafickou plochou a importovaným modulem random). Jakmile je příkaz potvrzen, uvidíme, co se stane v grafické ploše.
>>> canvas.create_line(0, 0, random.randrange(200), 100)
>>> canvas.create_line(0, 0, random.randrange(200), 100)
>>> canvas.create_line(0, 0, random.randrange(200), 100)
Nakreslete šest náhodných čísel od 1 do 49 vedle sebe v grafické ploše. Myslíte si, že takový program můžeme použít k losování čísel v loterii? Svou odpověď zdůvodněte.
Tento program nám nakreslí náhodný obdélník, který má levý horní bod na souřadnici [50, 100].
import tkinter
import random
canvas = tkinter.Canvas()
canvas.pack()
canvas.create_rectangle(50, 100, 50+random.randint(30, 100), 100+random.randint(30, 100))
Jak bychom zajistili, že na souřadnici [50, 100] bude nakreslen náhodný čtverec? Co musí obdélník splňovat, aby byl čtvercem? Musí mít stejnou šířku a výšku. Metoda random.randint() však nakreslí náhodnou hodnotu pokaždé, když ji použijete. Někdy se nám může stát, že hodnota bude stejná a bude to čtverec, ale často kreslí jiná čísla. Stačí si nakreslit číslo jednou, zapamatovat si ho a pak ho použít na místech, kde ho používáme. Můžeme si zapamatovat data v proměnné. Znáte proměnné z matematiky a používáte je k označení hodnoty, která se může změnit, často jako .
V programu vytvoříme proměnnou velikost, nakreslíme náhodné číslo a zapamatujeme si ho v této proměnné a tuto zapamatovanou hodnotu pak použijeme na místech, kde ji potřebujeme.
import tkinter
import random
canvas = tkinter.Canvas()
canvas.pack()
velikost = random.randint(30, 100)
canvas.create_rectangle(50, 100, 50+velikost, 100+velikost)
Můžeme si také zapamatovat souřadnice, na které kreslíme čtverec v proměnné, a pak při kreslení používat pouze proměnné.
x = 50
y = 100
velikost = random.randint(30, 100)
canvas.create_rectangle(x, y, x+velikost, y+velikost)
Pokud k proměnným x a y přičteme tah náhodného čísla, nakreslíme náhodný čtverec na náhodném místě.
x = random.randrange(200)
y = random.randrange(200)
velikost = random.randint(30, 100)
canvas.create_rectangle(x, y, x+velikost, y+velikost)
Pokud jsme již program spustili a do příkazového řádku napíšeme název proměnné a stiskneme Enter, Python nám zapíše aktuální hodnotu proměnné.
>>> x
61
>>> y
186
>>> velikost
42
V příkazové řádce můžeme také nastavit hodnoty proměnných.
>>> velikost = 100
>>> canvas.create_rectangle(x, y, x+velikost, y+velikost)
2
>>>
S proměnnými můžeme provádět matematické operace. Mezi základní patří sčítání (+), odčítání (-), násobení (*) a dělení (/). Python umí mnohem víc operací, ale tyto nám pro začátek stačí.
>>> a = 5
>>> b = 10
>>> c = a + b
>>> c
15
>>> d = c – 2 * a
>>> d
5
>>> d / 2
2.5
A můžeme také provést výpočet se samotnou proměnnou a výsledek si zapamatovat do stejné proměnné, tedy změnit její hodnotu podle výpočtu.
>>> a = 5
>>> a = a + 1
>>> a
6
>>>
V samotném programu (programovém režimu) nestačí napsat pouze název proměnné. Jakmile program spustí, Python nebude vědět, co má s proměnnou dělat. Na rozdíl od příkazového režimu musíme použít příkaz print() k zapsání nějaké hodnoty do okna shellu. Například: print(a) vypíše hodnotu proměnné a. Pomocí příkazu print() můžete také vypsat různé výpočty, např. print(a*3+5), print(6+2*4) nebo dokonce text (podobný create_text) print('Ahoj').
x = random.randrange(200)
y = random.randrange(200)
velikost = random.randint(30, 100)
canvas.create_rectangle(x, y, x+velikost, y+velikost)
print(x, y, velikost)
Pomocí random.choice() můžeme vybrat jeden náhodný prvek ze zadaného seznamu. V ukázce je to seznam ['red', 'yellow', 'blue']. Tento příkaz můžeme použít k nakreslení náhodné barvy z uvedených barev. Obdélník z předchozího příkladu vyplníme nakreslenou barvou. Abychom neměli příliš dlouhé příkazy, uložíme si náhodně zvolenou barvu do proměnné barva. Zde je výsledný program:
import tkinter
import random
canvas = tkinter.Canvas()
canvas.pack()
x = random.randrange(200)
y = random.randrange(200)
velikost = random.randint(30, 100)
barva = random.choice(['red', 'yellow', 'blue'])
canvas.create_rectangle(x, y, x+velikost, y+velikost, fill=barva)
print(x, y, velikost, barva)
Vysvětlení random.choice(['red', 'yellow', 'blue']):
['red', 'yellow', 'blue'] je Seznam (List) – tedy kolekce několika hodnot (zde tři barvy). Hodnoty jsou oddělené čárkami a uzavřené do hranatých závorek.('red', 'yellow', 'blue'). Tento typ se v Pythonu nazývá N-tice (Tuple).random.choice(...) znamená „vyber jednu náhodnou položku z toho seznamu“.Výsledkem bude vždy právě jedna z těchto tří barev – buď 'red', 'yellow', nebo 'blue'. Ta se uloží do proměnné barva.
Upravte program tak, abychom uprostřed ve čtverci viděli i nakreslenou velikost čtverce.
Vytvořte program, který nakreslí náhodnou čáru náhodné tloušťky. Pomocí příkazu print() zapisuje do shellu také informace o tloušťce čáry.
Vytvořte program, který nakreslí vodorovnou čáru o délce 50 bodů na náhodném místě. Pomocí příkazu print() zapisuje do shellu také informace o místě (x1 a x2).
Doposud jsme kreslili obrázky na pevném místě plochy. Všechny zadané souřadnice byla konkrétní čísla. Můžeme kreslit jednoduché tvary na náhodném místě. Na náhodném místě můžeme nakreslit i složitější obrázky, pokud se zamyslíme nad relativními souřadnicemi bodů. To znamená, že určíme jeden z bodů jako základní na obrázku a všechny ostatní souřadnice určíme relativně od tohoto referenčního bodu. To, zda je další bod nalevo nebo napravo od tohoto bodu, označuje, zda je souřadnice x menší nebo větší. To znamená, zda něco odečteme od souřadnice referenčního bodu nebo k němu něco přidáme. A tak je to i na souřadnici y.
Do programu můžeme také psát různé poznámky, kterých si Python nevšimne. Takovým textovým komentářům říkáme komentáře. Komentář vždy začíná znakem # a končí na konci řádku.
Někdy, když hledáme chybu, potřebujeme, aby program neprováděl některé řádky. Pak můžeme také použít # na začátku těchto řádků. Pokud je řádků více, vybereme je a v menu vybereme Format Comment Out Region, který k řádkům přidá #.
import tkinter
canvas = tkinter.Canvas(width=640, height=320)
canvas.pack()
canvas.create_rectangle(100, 100, 160, 200, fill='skyblue') #telo
canvas.create_rectangle(110, 50, 150, 100, fill='skyblue') #hlava
#oci
canvas.create_rectangle(115, 60, 125, 70, fill='yellow')
canvas.create_rectangle(135, 60, 145, 70, fill='yellow')
#usta
canvas.create_rectangle(115, 80, 145, 90, fill='red')
#nohy
canvas.create_rectangle(100, 200, 120, 280, fill='skyblue')
canvas.create_rectangle(140, 200, 160, 280, fill='skyblue')
#ruce
canvas.create_line(100,110,60,150, width=15)
canvas.create_line(160,110,210,150, width=15)
Tento program nakreslí tohoto robota.
Pokud bychom chtěli nakreslit stejného robota na různých místech, definujeme jeden bod jako základní. Například můžeme určit jako referenční bod levý horní bod těla obdélníku, obecně jej označit jako bod se souřadnicemi [x, y] a všechny ostatní body budou mít souřadnici podle toho, jak daleko jsou od tohoto bodu (relativní vzdálenost). Na obrázku vidíme vyznačený vztažný bod a velikosti jednotlivých částí obrázku.
Obdélník trupu robota lze určit pomocí základního bodu a pravého dolního bodu obdélníku trupu. Tento bod je 60 bodů dolů na ose x (protože obdélník je široký 60 bodů) a na ose y 100 bodů dolů (protože má zadanou výšku 100 bodů). Vzhledem k tomu, že referenční bod má obecnou souřadnici [x, y], pravý dolní roh trupu bude mít souřadnici [x+60, y+100]. Nakreslíme tedy trup příkazem
canvas.create_rectangle(x, y, x+60, y+100)
Můžeme nakreslit obdélník hlavy pomocí levého horního bodu hlavy a pravého dolního bodu hlavy. Levý horní bod hlavy je 10 bodů vpravo na souřadnici x a 50 bodů nahoru od základního bodu na souřadnici y. Je tedy na souřadnici [x+10, y-50]. Pravý dolní bod hlavy je 50 bodů vpravo na ose x a má stejnou souřadnici y jako referenční bod, takže jeho souřadnice jsou [x+50, y] a hlavu nakreslíme příkazem
canvas.create_rectangle(x+10, y-50, x+50, y)
Celý program, který kreslí tohoto robota na relativním místě, lze zapsat takto:
import tkinter
canvas = tkinter.Canvas(width=600, height=600)
canvas.pack()
x = 100
y = 100
#telo
canvas.create_rectangle(x, y, x+60, y+100, fill='skyblue') #telo
canvas.create_rectangle(x+10, y-50, x+50, y, fill='skyblue') #hlava
#oci
canvas.create_rectangle(x+15, y-40, x+25, y-30, fill='yellow')
canvas.create_rectangle(x+35, y-40, x+45, y-30, fill='yellow')
#usta
canvas.create_rectangle(x+15, y-20, x+45, y-10, fill='red')
#nohy
canvas.create_rectangle(x, y+100, x+20, y+180, fill='skyblue')
canvas.create_rectangle(x+40, y+100, x+60, y+180, fill='skyblue')
#ruce
canvas.create_line(x, y+10, x-40, y+50, width=15)
canvas.create_line(x+60, y+10, x+110, y+50, width=15)
Pokud nastavíme hodnotu proměnných x a y na náhodnou hodnotu, robot bude vykreslen na náhodném místě.
Dokončete robota tak, aby měl nakreslené uši, anténu na hlavě a na trupu své jméno (například “R.U.R.”)
Vytvořte nový program, který bude kreslit vlajku sportovního klubu. Vlajka bude tvořena čtyřmi barevnými obdélníky, které se vzájemně dotýkají v jediném bodě jako na obrázku:
Program si náhodně zvolí:
Vnější rozměry vlajky budou ; barvy na vlajce si urči podle svého uvážení.
Nakreslete tuto značku na náhodné místo na ploše tak, aby byl i rychlostní limit náhodný (30, 40, 50, 60, 80, 110).